/*
* Copyright (C) 2006, 2007 Dennis Hunziker, Ueli Kistler
* Copyright (C) 2007 Reto Schuettel, Robin Stocker
*
* IFS Institute for Software, HSR Rapperswil, Switzerland
*
*/
package org.python.pydev.refactoring.coderefactoring.extractmethod.edit;
import java.util.ArrayList;
import java.util.List;
import org.python.pydev.parser.jython.SimpleNode;
import org.python.pydev.parser.jython.ast.Assign;
import org.python.pydev.parser.jython.ast.Attribute;
import org.python.pydev.parser.jython.ast.Call;
import org.python.pydev.parser.jython.ast.Name;
import org.python.pydev.parser.jython.ast.NameTok;
import org.python.pydev.parser.jython.ast.Tuple;
import org.python.pydev.parser.jython.ast.exprType;
import org.python.pydev.refactoring.ast.adapters.IASTNodeAdapter;
import org.python.pydev.refactoring.ast.adapters.IClassDefAdapter;
import org.python.pydev.refactoring.coderefactoring.extractmethod.request.ExtractMethodRequest;
import org.python.pydev.refactoring.core.edit.AbstractReplaceEdit;
public class ExtractCallEdit extends AbstractReplaceEdit {
private String methodName;
private int offset;
private IASTNodeAdapter<?> offsetAdapter;
private int replaceLength;
private List<String> callParameters;
private List<String> returnVariables;
public ExtractCallEdit(ExtractMethodRequest req) {
super(req);
this.methodName = req.methodName;
this.offset = req.selection.getOffset();
this.replaceLength = req.selection.getLength();
this.offsetAdapter = req.getOffsetNode();
this.callParameters = req.parameters;
this.returnVariables = req.returnVariables;
}
@Override
protected SimpleNode getEditNode() {
List<exprType> argsList = initCallArguments();
Call methodCall = new Call(createCallAttribute(), argsList.toArray(new exprType[0]), null, null, null);
return initSubstituteCall(methodCall);
}
private SimpleNode initSubstituteCall(Call methodCall) {
if (returnVariables.size() == 0) {
return methodCall;
} else {
List<exprType> returnExpr = new ArrayList<exprType>();
for (String returnVar : returnVariables) {
returnExpr.add(new Name(returnVar, Name.Store, false));
}
exprType[] expr = returnExpr.toArray(new exprType[0]);
if (expr.length > 1) {
expr = new exprType[] { new Tuple(expr, Tuple.Load, false) };
}
return new Assign(expr, methodCall);
}
}
private List<exprType> initCallArguments() {
List<exprType> argsList = new ArrayList<exprType>();
for (String parameter : callParameters) {
argsList.add(new Name(parameter, Name.Load, false));
}
return argsList;
}
private exprType createCallAttribute() {
if (this.offsetAdapter instanceof IClassDefAdapter) {
return new Attribute(new Name("self", Name.Load, false), new NameTok(this.methodName, NameTok.Attrib),
Attribute.Load);
} else {
return new Name(this.methodName, Name.Load, false);
}
}
@Override
public int getOffsetStrategy() {
return 0;
}
@Override
public int getOffset() {
return offset;
}
@Override
protected int getReplaceLength() {
return replaceLength;
}
}